//! 定义所有触发的事件
//!
//! 对应事件在 [sgs_runtime] 中具体触发
//!
//! 在 [crate::pkg::event] 中只定义，不实现
//!

mod start;
pub use start::*;

mod round;
pub use round::*;

mod ability;
pub use ability::*;

mod role;
pub use role::*;

mod global;
pub use global::*;

mod lifecycle;
pub use lifecycle::*;

/// 所有事件的集合
///
/// 子事件都有 `Begin/End` 钩子事件
#[derive(Debug, PartialEq)]
pub enum Event {
    /// 该事件一般表示游戏发生了错误
    Error(String),

    /// 游戏开始信号
    Setup,

    /// 游戏开始的所有事件
    ///
    /// 有顺序区别
    Start(Start),

    /// 回合内事件
    ///
    ///
    /// 有顺序区别
    Round(Round),

    Ability(Ability),

    Role(Role),

    Global(Global),

    /// 生命周期循环事件
    ///
    /// 此类事件永远不会被加入事件栈中
    LifeCycle(LifeCycle),
}

impl Event {
    /// 判断是否是结束事件
    pub fn is_stop(&self) -> bool {
        if let Event::Global(Global::Stop) = self {
            true
        } else {
            false
        }
    }

    /// 生成事件栈
    ///
    /// 初始化 [Event::Setup] 事件
    pub fn init_stack() -> Vec<Self> {
        vec![Event::Setup]
    }
}
